package org.app.data.temp;

import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Array;
import java.lang.reflect.InvocationTargetException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;

public class DeJSON {
	
//	   json规律
// 1） 并列的数据之间用逗号（"，"）分隔。
// 2） 映射用冒号（"："）表示。
// 3） 并列数据的集合（数组）用方括号("[]")表示。
// 4） 映射的集合（对象）用大括号（"{}"）表示。


	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}
	
	/**
	 * 转换自定义类->json,
	 * 内省获取 属性信息 ，
	 * propertyDescriptor[] 包括其自身class属性，转换时跳过
	 * 
	 * 
	 * @param t
	 * @return
	 */
	protected <T>String fromBean(T t){
		
		StringBuffer sb=new StringBuffer("{");
		if(t.getClass()==Object.class)return t.toString();
		try {
			BeanInfo bean=Introspector.getBeanInfo(t.getClass());
			PropertyDescriptor[] pds=bean.getPropertyDescriptors();
			for(PropertyDescriptor pd:pds){
				Class type=pd.getPropertyType();
				String name=pd.getName();
				
				if(name.equals("class"))continue;
				Object value=pd.getReadMethod().invoke(t);
		//		System.out.println(type+":"+name+"-"+value+":"+value.getClass());
				
				if(value!=null){
				sb.append("\""+name+"\":");
				sb.append(toJSON(value)+",");
				}
			}
			
		} catch (IntrospectionException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalAccessException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalArgumentException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		sb.setCharAt(sb.length()-1, '}');
		//System.out.println(sb);
		return sb.toString();
	}
	
	public String toJSON(List list){
		StringBuffer sb=new StringBuffer("[");
		
		for(Object obj:list){
			
			sb.append(toJSON(obj)+",");
		}
		
		sb.setCharAt(sb.length()-1, ']');
		return sb.toString();
	}
	
	/**
	 * 默认 map 对应json中的 key:value
	 * 考虑 value 为自定义类（即 key:{*:*,}）的情况
	 * 分 {#:{#:#,#:#}}和{#:#,#:#} 
	 * @param map
	 * @return
	 */
	public String toJSON(Map map){
		StringBuffer sb=new StringBuffer("{");
	//	boolean result=false;
		
		for(Object obj:map.entrySet()){
			Entry entry=(Entry) obj;		
			String value=toJSON(entry.getValue());
			System.out.println(value);
			sb.append("\""+entry.getKey()+"\":"+value+",");
//			if(value.charAt(0)=='{'){
//				result=true;
//			}
		}
		
		
//		if(result){
//			sb.setCharAt(0, '[');
//			sb.setCharAt(sb.length()-1, ']');
//		}else
		sb.setCharAt(sb.length()-1, '}');
		return sb.toString();
	}
	
	
	/**
	 * 分情况转 json
	 * int long double float 等数值型 变量（Number）直接返回 数值
	 * String 字符串变量 返回 “字符串”
	 * int[],long[],double[],float等数组及List链表 {*:*,*:*}
	 * Map映射根据 key对于value的类型不同分 {}和[]
	 * @param obj
	 * @return
	 */
	public String toJSON(Object obj){
		if(obj==null)return null;
		
		if(obj instanceof Number){
			return obj.toString();
		}
		
		
		
		if(obj instanceof String){
			return "\""+obj+"\"";
		}
		
		if(obj instanceof Map){
			return toJSON((Map)obj);
		}
		
		if(obj instanceof List){
			return toJSON((List)obj);
		}
		
		
		if(obj.getClass().isArray()){
			List list=toList(obj);
			return toJSON((List)list);
		}
		
		return fromBean(obj);
	}
	
	/**
	 * obj为数组
	 * 包括 int[] ,double[] ,float[] ,String[] 等
	 * @param obj
	 * @return
	 */
	public List toList(Object obj){
		List list=new ArrayList();
		Class type=obj.getClass();
		if(type.isArray()){
		//	type=type.getComponentType();
			int size=Array.getLength(obj);
			for(int i=0;i<size;i++){
				list.add(Array.get(obj, i));
			}
		}
		
		
		return list;
	}
	

}
